import { defineConfig, loadEnv } from 'vite'
import path, { resolve } from 'path'
import createVitePlugins from './vite/plugins'

export default ({ mode, command }) => {
  const root = process.cwd()
  const env = loadEnv(mode, root)
  // 获取配置环境参数
  console.log(command, env)
  return defineConfig({
    base: env.VITE_PUBLIC_PATH,
    manifest: true,
    optimizeDeps: {
      exclude: ['electron']
    },
    // 插件配置
    plugins: createVitePlugins(),
    // 配置别名
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src')
      }
    },
    // 开发环境配置
    server: {
      // 设置 host: true 以 IP 访问项目
      host: true,
      //端口号
      port: env.VITE_DEV_PORT || 3333,
      // 是否自动打开浏览器
      open: true,
      // 跨域设置允许
      cors: true,
      // 端口被占用时，是否直接退出
      strictPort: false,
      // 接口代理
      proxy: {
        '/api/v1': {
          target: env.VITE_PROXY_API,
          ws: true,
          // 是否允许跨域
          changeOrigin: true,
          configure: (proxy, options) => {
            proxy.on('proxyReq', (proxyReq, req, res) => {
              console.log('真实请求地址:', `${options.target}${req.url}`)
            })
          }
        }
      },
      //预热常用文件，提高初始页面加载速度
      warmup: {
        clientFiles: ['./src/layouts/**/*.vue']
      }
    },
    // css配置
    css: {
      preprocessorOptions: {
        scss: {
          javascriptEnabled: true,
          additionalData: '@use "./src/styles/variable.scss";'
        }
      }
    },
    // 打包配置
    build: {
      // 指定输出路径
      outDir: resolve(__dirname, 'dist'),
      minify: 'terser',
      // 规定触发警告的 chunk 大小
      chunkSizeWarningLimit: 3000,
      // 是否生成 source map
      sourcemap: false,
      // 禁用 gzip 压缩大小报告
      reportCompressedSize: false,
      //Vite 会在构建时清空该目录
      emptyOutDir: true,
      // 打包时清除console和debugger
      terserOptions: {
        compress: {
          keep_infinity: true,
          drop_console: true,
          drop_debugger: true
        }
      },
      // rollup配置
      rollupOptions: {
        output: {
          manualChunks(id) {
            if (id.includes('node_modules')) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString()
            }
          },
          entryFileNames: 'js/[name].[hash].js',
          chunkFileNames: 'js/[name].[hash].js',
          assetFileNames(assetInfo) {
            if (assetInfo.name.endsWith('.css')) {
              return 'css/[name].[hash].css'
            }
            if (['.png', '.jpg', '.jpeg', '.svg'].some(ext => assetInfo.name.endsWith(ext))) {
              return 'imgs/[name].[hash].[ext]'
            }
            return 'assets/[name].[hash].[ext]'
          }
        }
      }
    }
  })
}
